# 1.18 名称映射到序列的元素中
# 解决方案, 使用 collections.namedtuple()(命名元祖,是一个工厂方法,返回的是元祖类型的子类)
from collections import namedtuple
Subscriber = namedtuple('Subscrber',['addr','joined'])
sub = Subscriber('jons@example.com','2012-10-19')
print(sub.addr)
# 修改热河属性,不能直接修改, 可以使用_replace()方法实现
sub = sub._replace(joined = '2018-10-23')
print(sub.joined)

# 1.19 同时对数据做转换和换算
# 解决方案 : 在函数参数中使用生成器表达式. 例如计算平方和:
nums= [ 1,2,3,4,5]
s=sum(x * x for x in nums)
# 例2, 判断文件是不是py
import os
files = os.listdir('.')
if any(name.endswith('.py') for name in files):
    print('is python!')
else:
    print('no python')

#例3 元祖转CSV
s = ('ACME',50,123.3)
print(','.join(str(x) for x in s))

# 1.20 多个映射合并为单个映射
#解决方案 : 案例如下, 假设需要先找a在找b, 一种简单的方法是利用 colletions模块中的ChainMap类来解决
a = {'x' : 1, 'z':3}
b = {'y':2, 'z':5}
from collections import ChainMap
c = ChainMap(a,b)
print(c['z'])
#有重复的键,会采用第一个映射中所对应的值
# ChainMap 与带有作用域的值(如全局变量) 一起工作是特别有用, 如下:
vaules = ChainMap()
vaules['x'] = 1
vaules = vaules.new_child()
vaules['x'] = 2
vaules = vaules.new_child()
vaules['x'] = 3
print(vaules)
print(vaules['x'])
vaules = vaules.parents
print(vaules)